package vues;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.UIManager;

import logique.administration.AjoutVille;
import logique.administration.ModifVille;
import logique.parser.factories.TailleVilleFactory;
import logique.reseau.Ville;
import logique.reseau.atouts.ATVGenerique;
import logique.reseau.tailles.Grande;
import logique.reseau.tailles.Moyenne;
import logique.reseau.tailles.Petite;

public class PanelVille extends javax.swing.JFrame{

	private PanelAdministration admin;
	private JFrame jFrameEditerVille;
	private JButton jButtonValider;
	private JButton jButtonAnnuler;
	private JLabel jLabelNom;
	private JTextField jTextFieldNom;
	private JLabel jLabelType;
	private JLabel jLabelTouristique;
	private JComboBox jComboBoxType;
    private JComboBox jComboBoxTouristique;
    private Ville ville;
    
    private void initNom(String v){
    	if (!v.equals("")){
	    	jTextFieldNom.setText(v);
	    }
    }
    
    private void initType(){
	    if (this.ville != null){
	    	if(this.ville.getTaille() != null){
	    		jComboBoxType.setSelectedItem(this.ville.getTaille().intitule());
	    	}else{
	    		jComboBoxType.setSelectedItem(Petite.getInstance().intitule());
	    	}
	    }
    }
    
    private void initTouristique(){
    	 if (this.ville != null){
 	    	if (this.ville.getAtoutsTouristiques().size()>0){
 	    		jComboBoxTouristique.setSelectedItem("Oui");
 	    	}else{
 	    		jComboBoxTouristique.setSelectedItem("Non");
 	    	}
 	    }
    }
    
	public PanelVille(PanelAdministration admin, String v){
		
//			 Enregistrement de la reference sur la fenetre principale
		this.admin = admin;
		this.ville = admin.rechercherVille(v);
			
		//Le look and feel de l'application est choisi en fonction de la plateforme
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch(Exception e) {
			System.err.println("Impossible to load the native look and feel for this platform.");
		}
		
		jFrameEditerVille = new JFrame("Gestion des villes");
		jButtonValider = new JButton();
		jButtonAnnuler = new JButton();
		jLabelNom = new JLabel();
		jTextFieldNom = new JTextField();
		jLabelType = new JLabel();
		jComboBoxType = new JComboBox();
	    jLabelTouristique = new JLabel();
	    jComboBoxTouristique = new JComboBox();
	    
		jFrameEditerVille.getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
	    
		jButtonValider.setText("Valider");
	    jButtonValider.addMouseListener(new java.awt.event.MouseAdapter() {
	        public void mouseClicked(java.awt.event.MouseEvent evt) {
	            sourisValiderEditerVille(evt);
	        }
	    });
	
	    jFrameEditerVille.getContentPane().add(jButtonValider, new org.netbeans.lib.awtextra.AbsoluteConstraints(210, 210, -1, -1));
	
	    jButtonAnnuler.setText("Annuler");
	    jButtonAnnuler.addMouseListener(new java.awt.event.MouseAdapter() {
	        public void mouseClicked(java.awt.event.MouseEvent evt) {
	            sourisAnnulerEditerVille(evt);
	        }
	    });
	
	    jFrameEditerVille.getContentPane().add(jButtonAnnuler, new org.netbeans.lib.awtextra.AbsoluteConstraints(310, 210, -1, -1));
	
	    jLabelNom.setText("Nom : ");
	    jFrameEditerVille.getContentPane().add(jLabelNom, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 50, -1, -1));
	
	    initNom(v);
	    
	    jFrameEditerVille.getContentPane().add(jTextFieldNom, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 50, 210, -1));
	
	    jLabelType.setText("Type: ");
	    jFrameEditerVille.getContentPane().add(jLabelType, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 100, -1, -1));
	
	    jComboBoxType.setModel(new javax.swing.DefaultComboBoxModel(new String[] { Petite.getInstance().intitule(), Moyenne.getInstance().intitule(), Grande.getInstance().intitule() }));
	    jFrameEditerVille.getContentPane().add(jComboBoxType, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 100, 210, -1));
	    
	    initType();
	    
	    jLabelTouristique.setText("Touristique : ");
	    jFrameEditerVille.getContentPane().add(jLabelTouristique, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 150, -1, -1));
	
	    jComboBoxTouristique.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Oui", "Non" }));
	    jFrameEditerVille.getContentPane().add(jComboBoxTouristique, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 150, 210, -1));
	    
	    initTouristique();
	    
	    jFrameEditerVille.setAlwaysOnTop(true);
	    jFrameEditerVille.pack();
	    
	    //on centre le fenetre
	    jFrameEditerVille.setLocationRelativeTo(admin.getInterfacePrincipale());
	    
	    jFrameEditerVille.setVisible(true);
	}
	
	private void sourisAnnulerEditerVille(java.awt.event.MouseEvent evt) {                                          
		//on ferme la frame
		jFrameEditerVille.setVisible(false);
	}                                         
	
	private boolean verifDoublons(javax.swing.JList l, String s){
		for (int i=0; i<l.getModel().getSize(); i++){
			if (((String) l.getModel().getElementAt(i)).equalsIgnoreCase(s)){
				return false;//il y a un doublon
			}
		}
		return true;//tout est ok
	}
	
	private void sourisValiderEditerVille(java.awt.event.MouseEvent evt) {
		//on ajoute la ville au panel administration
		String s = jTextFieldNom.getText();
		javax.swing.JList l = this.admin.getListeVilles();
		if (s.equals("")){
			JOptionPane.showMessageDialog(jFrameEditerVille, "Vous devez nommer la ville");
			jTextFieldNom.setText("");
			jTextFieldNom.grabFocus();
		}else{
			if (ville == null && verifDoublons(l, s)){ //c'est une nouvelle ville
				Ville v = new Ville();
				v.setNom(s);
				v.setTaille(TailleVilleFactory.getInstance().getInstanceTailleVille((String)jComboBoxType.getSelectedItem()));
				if (((String)jComboBoxTouristique.getSelectedItem()).equals("Oui")){
					v.addAtoutTouristique(ATVGenerique.getInstance());
				}
				
				//on recupere le contenu courant de la liste et on y ajoute la nouvelle valeur
				String[] liste = new String[l.getModel().getSize()+1];
				liste[0] = s ;
				for (int i=0; i<l.getModel().getSize(); i++){
					liste[i+1] = (String) l.getModel().getElementAt(i);
				}
				
				java.util.Arrays.sort(liste) ;
				
				//on reaffecte la liste
				l.setListData(liste);
				this.admin.getMAJ().ajoutModification(new AjoutVille(v));
				this.admin.getMesVilles().put(v.getNom(), v);
				
				//on ferme la frame
				jFrameEditerVille.setVisible(false);
			}else{
				if (ville != null){
					//on doit mettre a jour les donn�es
					Ville v = new Ville();
					v.setNom(s);
					v.setTaille(TailleVilleFactory.getInstance().getInstanceTailleVille((String)jComboBoxType.getSelectedItem()));
					if (((String)jComboBoxTouristique.getSelectedItem()).equals("Oui")){
						v.addAtoutTouristique(ATVGenerique.getInstance());
					}
					
					this.admin.getMAJ().ajoutModification(new ModifVille(this.ville, v));
					this.admin.getMesVilles().remove(this.ville.getNom());
					this.admin.getMesVilles().put(v.getNom(), v);
					
	//				on ferme la frame
					jFrameEditerVille.setVisible(false);
				}else{
					 JOptionPane.showMessageDialog(jFrameEditerVille, "Cette ville existe déjà");
					 jTextFieldNom.setText("");
					 jTextFieldNom.grabFocus();
				}
			}
		}
	}                                      
}
